win32: use a struct for the event source
authorPaolo Borelli <pborelli@gnome.org>
Sat, 5 Mar 2016 18:02:15 +0000 (19:02 +0100)
committerPaolo Borelli <pborelli@gnome.org>
Sat, 5 Mar 2016 19:31:10 +0000 (20:31 +0100)
This removes the event_poll_fd global variable and the (ab)use of
get_default_display. It is also more consistent with other backends.

Also store display

gdk/win32/gdkdisplay-win32.c
gdk/win32/gdkevents-win32.c
gdk/win32/gdkprivate-win32.h

index 25273b5b38736f1108b5c38da25299cdf7d1b4a9..c739e73812af7ea1fca8d4f47ba2f0801d5b4b11 100644 (file)
@@ -232,7 +232,7 @@ _gdk_win32_display_open (const gchar *display_name)
 
   win32_display->screen = g_object_new (GDK_TYPE_WIN32_SCREEN, NULL);
 
-  _gdk_events_init ();
+  _gdk_events_init (_gdk_display);
 
   _gdk_input_ignore_core = FALSE;
 
index b326b901b22c94ec9fab3134f3de26faed25f229..1f802af1a8d72b0114d63486680d45061f97ab19 100644 (file)
@@ -108,6 +108,14 @@ extern gint       _gdk_input_ignore_core;
 
 GdkCursor *_gdk_win32_grab_cursor;
 
+typedef struct
+{
+  GSource source;
+
+  GdkDisplay *display;
+  GPollFD event_poll_fd;
+} GdkWin32EventSource;
+
 static GSourceFuncs event_funcs = {
   gdk_event_prepare,
   gdk_event_check,
@@ -115,8 +123,6 @@ static GSourceFuncs event_funcs = {
   NULL
 };
 
-GPollFD event_poll_fd;
-
 static GdkWindow *mouse_window = NULL;
 static GdkWindow *mouse_window_ignored_leave = NULL;
 static gint current_x, current_y;
@@ -286,9 +292,10 @@ _gdk_win32_window_procedure (HWND   hwnd,
 }
 
 void
-_gdk_events_init (void)
+_gdk_events_init (GdkDisplay *display)
 {
   GSource *source;
+  GdkWin32EventSource *event_source;
 
 #if 0
   int i, j, n;
@@ -376,20 +383,22 @@ _gdk_events_init (void)
   GDK_NOTE (EVENTS, g_print ("latin_locale = %08x\n", (guint) latin_locale));
 #endif
 
-  source = g_source_new (&event_funcs, sizeof (GSource));
+  source = g_source_new (&event_funcs, sizeof (GdkWin32EventSource));
   g_source_set_name (source, "GDK Win32 event source");
   g_source_set_priority (source, GDK_PRIORITY_EVENTS);
 
+  event_source = (GdkWin32EventSource *)source;
+  event_source->display = display;
 #ifdef G_WITH_CYGWIN
-  event_poll_fd.fd = open ("/dev/windows", O_RDONLY);
-  if (event_poll_fd.fd == -1)
+  event_source->event_poll_fd.fd = open ("/dev/windows", O_RDONLY);
+  if (event_source->event_poll_fd.fd == -1)
     g_error ("can't open \"/dev/windows\": %s", g_strerror (errno));
 #else
-  event_poll_fd.fd = G_WIN32_MSG_HANDLE;
+  event_source->event_poll_fd.fd = G_WIN32_MSG_HANDLE;
 #endif
-  event_poll_fd.events = G_IO_IN;
+  event_source->event_poll_fd.events = G_IO_IN;
 
-  g_source_add_poll (source, &event_poll_fd);
+  g_source_add_poll (source, &event_source->event_poll_fd);
   g_source_set_can_recurse (source, TRUE);
   g_source_attach (source, NULL);
 }
@@ -3501,19 +3510,17 @@ static gboolean
 gdk_event_prepare (GSource *source,
                   gint    *timeout)
 {
-  GdkDisplay *display;
+  GdkWin32EventSource *event_source = (GdkWin32EventSource *)source;
   gboolean retval;
 
-  display = gdk_display_get_default ();
-
   gdk_threads_enter ();
 
   *timeout = -1;
 
-  if (display->event_pause_count > 0)
-    retval =_gdk_event_queue_find_first (display) != NULL;
+  if (event_source->display->event_pause_count > 0)
+    retval =_gdk_event_queue_find_first (event_source->display) != NULL;
   else
-    retval = (_gdk_event_queue_find_first (display) != NULL ||
+    retval = (_gdk_event_queue_find_first (event_source->display) != NULL ||
               (modal_win32_dialog == NULL &&
                GetQueueStatus (QS_ALLINPUT) != 0));
 
@@ -3525,17 +3532,15 @@ gdk_event_prepare (GSource *source,
 static gboolean
 gdk_event_check (GSource *source)
 {
-  GdkDisplay *display;
+  GdkWin32EventSource *event_source = (GdkWin32EventSource *)source;
   gboolean retval;
 
-  display = gdk_display_get_default ();
-
   gdk_threads_enter ();
 
-  if (display->event_pause_count > 0)
-    retval = _gdk_event_queue_find_first (display) != NULL;
-  else if (event_poll_fd.revents & G_IO_IN)
-    retval = (_gdk_event_queue_find_first (display) != NULL ||
+  if (event_source->display->event_pause_count > 0)
+    retval = _gdk_event_queue_find_first (event_source->display) != NULL;
+  else if (event_source->event_poll_fd.revents & G_IO_IN)
+    retval = (_gdk_event_queue_find_first (event_source->display) != NULL ||
               (modal_win32_dialog == NULL &&
                GetQueueStatus (QS_ALLINPUT) != 0));
   else
@@ -3548,18 +3553,16 @@ gdk_event_check (GSource *source)
 
 static gboolean
 gdk_event_dispatch (GSource     *source,
-                   GSourceFunc  callback,
-                   gpointer     user_data)
+                    GSourceFunc  callback,
+                    gpointer     user_data)
 {
-  GdkDisplay *display;
+  GdkWin32EventSource *event_source = (GdkWin32EventSource *)source;
   GdkEvent *event;
 
-  display = gdk_display_get_default ();
-
   gdk_threads_enter ();
 
-  _gdk_win32_display_queue_events (display);
-  event = _gdk_event_unqueue (display);
+  _gdk_win32_display_queue_events (event_source->display);
+  event = _gdk_event_unqueue (event_source->display);
 
   if (event)
     {
@@ -3569,11 +3572,11 @@ gdk_event_dispatch (GSource     *source,
 
       /* Do drag & drop if it is still pending */
       if (_dnd_source_state == GDK_WIN32_DND_PENDING)
-       {
-         _dnd_source_state = GDK_WIN32_DND_DRAGGING;
-         _gdk_win32_dnd_do_dragdrop ();
-         _dnd_source_state = GDK_WIN32_DND_NONE;
-       }
+        {
+          _dnd_source_state = GDK_WIN32_DND_DRAGGING;
+          _gdk_win32_dnd_do_dragdrop ();
+          _dnd_source_state = GDK_WIN32_DND_NONE;
+        }
     }
 
   gdk_threads_leave ();
index b604df62622398711903c2b55b2a699c8466c096..b3f89d3ff9e7bf2ad3eee8da5ce7865fcdc2949e 100644 (file)
@@ -540,6 +540,6 @@ gboolean _gdk_win32_window_lacks_wm_decorations (GdkWindow *window);
 /* Initialization */
 void _gdk_win32_windowing_init (void);
 void _gdk_dnd_init    (void);
-void _gdk_events_init (void);
+void _gdk_events_init (GdkDisplay *display);
 
 #endif /* __GDK_PRIVATE_WIN32_H__ */